package com.oig.sys.security;


import com.oig.sys.security.config.PermitUrlProperties;
import com.oig.sys.security.config.SecurityAutoConfig;
import com.oig.sys.security.config.SecurityResourceConfig;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Import;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 *  spring security:
 *
 *  AuthenticationManager：负责认证管理，
 *      解析用户登录信息（封装在Authentication），读取用户、角色、权限信息进行认证，认证结果被回填到Authentication，保存在SecurityContext。
 *    有实现类 ProviderManager 管理各种provider
 *  AuthenticationProvider
 *    认证器 具体的认证逻辑实现，有跟AuthenticationManager一样的方法 authenticate(),  内置了多种认证器AuthenticationProvider，只要其中一个认证通过，认证便成功。
 *
 *  AccessDecisionManager：负责鉴权投票表决，汇总投票器的结果，实现一票通过（默认）、多票通过、一票否决策略。
 *  Authentication：认证信息，保存用户的身份标示、权限列表、证书、认证通过标记等信息。
 *
 *
 * 注： 只要引入了 spring-security 就会自动装配一些security的配置，启动器要排除SecurityAutoConfiguration, ManagementWebSecurityAutoConfiguration才行
 */
@Documented
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@EnableConfigurationProperties(PermitUrlProperties.class)
@EnableWebSecurity
@Import({ SecurityAutoConfig.class, SecurityResourceConfig.class})
public @interface EnableOauthResourceServer {


}
